#!/bin/bash

# -------------------------------
# 1. 解析输入参数（实验编号列表）
# -------------------------------
experiment_ids=("$@")   # 把所有输入参数当做实验编号存储在数组里
monitor_all=false

if [ ${#experiment_ids[@]} -eq 0 ]; then
    # 如果没有提供任何参数，则监控所有 run* 日志文件
    monitor_all=true
fi

# -------------------------------
# 2. 根据实验编号获取需要监控的文件
# -------------------------------
log_files=()

if [ "$monitor_all" = true ]; then
    # 监控所有 run* 日志文件
    log_files=(output/fct*)
else
    # 只监控指定实验编号的日志文件
    # 例如，传入 2 3 时，就匹配 log/run_*_2.log 和 log/run_*_3.log
    for id in "${experiment_ids[@]}"; do
        # 将匹配到的文件名添加到数组 log_files
        # 注意：如果某个 id 没有对应文件，则不会添加任何内容
        for f in output/fct_*_"${id}".txt; do
            # 如果通配符没有匹配到实际的文件，f 就是原始字符串 log/run_*_"${id}".log
            # 所以需要做一次 -f 判断确保是文件
            if [ -f "$f" ]; then
                log_files+=("$f")
            fi
        done
    done
    
    # 可能会有重复文件（比如文件名中不符合我们猜测的规则，也可能通配多次），这里去重一下
    # 可以用排序+uniq的方式（只适用于不含空格的文件名）
    # 如果文件名里包含空格，需要更复杂的处理。
    log_files=($(printf "%s\n" "${log_files[@]}" | sort -u))
fi

# 如果最终 log_files 为空，可以给一个提示
if [ ${#log_files[@]} -eq 0 ]; then
    echo "没有找到匹配的日志文件。"
    exit 0
fi

# -------------------------------
# 3. 声明数组，用来记录当前行数和上一轮行数
# -------------------------------
declare -A file_lines
declare -A prev_lines

# -------------------------------
# 4. 进度条函数
# -------------------------------
print_progress_bar() {
    local current=$1
    local target=$2
    local percent=0

    if [[ $target -gt 0 ]]; then
        percent=$((current * 100 / target))
    fi

    local progress=""
    local length=50
    local filled=$((length * percent / 100))
    
    for ((i=0; i<filled; i++)); do
        progress="${progress}#"
    done
    for ((i=filled; i<length; i++)); do
        progress="${progress}."
    done
    
    echo -n "[${progress}] ${percent}%"
}

# -------------------------------
# 5. 初始化每个文件的行数
# -------------------------------
for file in "${log_files[@]}"; do
    if [[ -f $file ]]; then
        file_lines["$file"]=$(wc -l < "$file")
        prev_lines["$file"]=${file_lines["$file"]}
    fi
done

# -------------------------------
# 6. 进入循环实时监控
# -------------------------------
while true; do
    clear
    echo "实时更新日志文件的进度："
    
    # 遍历需要监控的文件
    for file in "${log_files[@]}"; do
        if [[ -f $file ]]; then
            current_lines=$(wc -l < "$file")
            
            # 计算该轮新增加的行数
            new_lines=$((current_lines - prev_lines["$file"]))
            prev_lines["$file"]=$current_lines

            # 通过文件名匹配负载值与实验编号
            # 假设命名模式: run_<something>_<load>_<expid>.log
            # 并且这里示例中假设目标行数跟 load 相关
            target=0
            load_value=0
            
            # if [[ $file =~ fct_([a-zA-Z0-9]+)_([0-9]+)_([0-9]+)\.txt ]]; then
            if [[ $file =~ fct_([a-zA-Z0-9]+)_([0-9]+)_([0-9]+)_([a-zA-Z0-9]+)\.txt ]]; then
                load_value=${BASH_REMATCH[2]}
                # 这里演示一个简单计算规则: (load / 10) * 23300 * 2
                target=$(( (load_value / 10) * 22000 ))
            fi
            progress=$(print_progress_bar "$current_lines" "$target")
            echo -e "$file:\t$progress (+$new_lines 行)"
        fi
    done
    
    # 休眠5秒后再次刷新
    sleep 10
done
